package com.mh.config;


import com.mh.filter.KaptchaFilter;
import com.mh.handler.MyAuthNGHandlerImpl;
import com.mh.handler.MyAuthOKHandlerImpl;
import com.mh.handler.MyLogoutHandlerImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private MyAuthOKHandlerImpl myAuthOKHandler;
    @Autowired
    private MyAuthNGHandlerImpl myAuthNGHandler;
    @Autowired
    private MyLogoutHandlerImpl myLogoutHandler;

    @Autowired
    private KaptchaFilter kaptchaFilter;

    //过滤器链设置
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                //开始授权,允许哪些请求可以访问
                .authorizeRequests()
                //将指定页面设置为公共资源,无需认证&授权
                .mvcMatchers("/login.html","/code/image").permitAll()
                //除公共资源外,其他请求都需要认证
                .anyRequest().authenticated();

        http
                //开启表单登录功能
                .formLogin()
                //登录页面
                .loginPage("/login.html")
                //提交表单路径
                .loginProcessingUrl("/login")
                //表单中的用户名
                .usernameParameter("username")
                //表单中的密码
                .passwordParameter("password")
                //指定自定义登录成功处理器
                .successHandler(myAuthOKHandler)
                //指定自定义登录失败处理器
                .failureHandler(myAuthNGHandler);

        /** 一般不直接写跳转的页面,指定成功/失败/退出的处理器(实现SpringSecurity提供的接口的自定义类)
         *  .successForwardUrl("/index") //登录成功后转发到 /index
         *  .defaultSuccessUrl("/") //重定向
         *  .failureUrl("/login.html") //登录失败后重定向到 /login.html
         *  .logoutSuccessUrl("/login.html")
         */

        http
                //开启退出配置
                .logout()
                //退出登录地址
                .logoutUrl("/logout")
                //退出时Session是否失效,默认true
                .invalidateHttpSession(true)
                //退出时是否清除认证信息,默认true
                .clearAuthentication(true)
                //指定自定义退出处理器
                .logoutSuccessHandler(myLogoutHandler);

        http    //禁用 CSRF 防护
                .csrf().disable();

        http    //将自定义的图形验证码校验过滤器添加到UsernamePasswordAuthenticationFilter之前
                .addFilterBefore(kaptchaFilter, UsernamePasswordAuthenticationFilter.class);
    }
}
